//litter解释语言
//c 2025 Obsever Studio
#include<iostream>
#include<fstream>
#include<sstream>
#include<vector>
#include<set>
#include<map>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<functional>
#include<string.h>
#include<stdint.h>
#define KW 1
#define OP 2
using namespace std;
struct token{
	string data;
	uint16_t type;
};
token ops[1024],*pops=ops;
map<string,uint16_t> ttm;
void ao(const string &op){
	token t={op,ttm[op]};
	*(pops++)=t;
}
void init(){
	ttm["fn"]=KW;ttm["ret"]=KW;
	ttm["if"]=KW;
	ttm["while"]=KW;ttm["until"]=KW;
	ttm["goto"]=KW;ttm["label"]=KW;
	ttm["+"]=ttm["-"]=OP;
	ttm["*"]=ttm["/"]=ttm["%"]=OP;
	ttm["]"]/*&*/=ttm["["]/* * */=OP;
}
int main(int ac,char **av){
	if(ac==1){
		cout<<"Usage: litter [.ltr]";
		return 1;
	}
	ifstream ifp(av[1]);
	if(!ifp.is_open()){
		cout<<"Can't open the file";
		return 2;
	}
	init();
	bool str;
	string temp,t2;
	while(getline(ifp,temp)){//分析 
		for(const auto &ch:temp){
			if(ch=='\"'||ch=='\''){
				str=!str;
				t2+=string(1,ch);
			}else if(!str&&ch==' '){
				if(!t2.empty()){
					ao(t2);
					t2="";
				}
			}else if(ch==';'){
				break;
			}else{
				t2+=string(1,ch);
			}
		}
		if(!t2.empty()){
			ao(t2);
			t2="";
		}
	}
}